/* NOTICE
    OpenJaWS - Open Java Weather Station
    
    Copyright (C) 2008 Grant Gardner <grant@lastweekend.com.au>
    
    OpenJaWS is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
    
NOTICE */

package au.com.lastweekend.openjaws.units;

public enum DistanceUnit implements Unit {

    METRE(1.0, "m"),
    YOTTAMETRE(SIPrefix.YOTTA),
    ZETTAMETRE(SIPrefix.ZETTA),
    EXAMETRE(SIPrefix.EXA),
    PETAMETRE(SIPrefix.PETA),
    TERAMETRE(SIPrefix.TERA),
    GIGAMETRE(SIPrefix.GIGA),
    MEGAMETRE(SIPrefix.MEGA),
    KILOMETRE(SIPrefix.KILO),
    HECTOMETRE(SIPrefix.HECTO),
    DECAMETRE(SIPrefix.DECA),
    DECIMETRE(SIPrefix.DECI),
    CENTIMETRE(SIPrefix.CENTI),
    MILLIMETRE(SIPrefix.MILLI),
    MICROMETRE(SIPrefix.MICRO),
    NANOMETRE(SIPrefix.NANO),
    PICOMETRE(SIPrefix.PICO),
    FEMTOMETRE(SIPrefix.FEMTO),
    ATTOMETRE(SIPrefix.ATTO),
    ZEPTOMETRE(SIPrefix.ZEPTO),
    YOCTOMETRE(SIPrefix.YOCTO),

    MICRON(MICROMETRE.multiplier, MICROMETRE.utfSymbol),
    INCH(25.4 * MILLIMETRE.multiplier, "in"),
    FOOT(12.0 * INCH.multiplier, "ft"),
    YARD(3.0 * FOOT.multiplier, "yd"),
    MILE(1760.0 * YARD.multiplier, "mi"),
    NAUTICAL_MILE(1.852, "NM");

    private double multiplier;
    private String utfSymbol;

    private DistanceUnit(double siFactor, String symbol) {

        this.multiplier = siFactor;
        this.utfSymbol = symbol;
    }

    private DistanceUnit(SIPrefix metric) {

        this(metric.getMultiplier(), metric.toString() + "m");
    }

    public String toString() {

        return utfSymbol;
    }

    public double convertFrom(double value, Unit unit) {

        return value * ((DistanceUnit) unit).multiplier / multiplier;
    }

    public double getMultiplier() {

        return multiplier;
    }

}
